﻿/*!
 *  Copyright (c), 上海沃恩信息科技有限公司.
 *  All rights reserved.
 *  Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System;
using System.IO;
using Pittypat;

namespace Waln.Authority.Authentication
{
    /// <summary>
    /// 定义一个模块导航项目。
    /// </summary>
    sealed class NavModule : INavModule
    {
        private Data.Module module;
        private @string? url;

        /// <summary>
        /// 使用从数据服务查询到的模块信息、开发者代码和应用标识符初始化 NavModule 的新实例。
        /// </summary>
        /// <param name="module">模块信息。</param>
        /// <param name="developerCode">开发者代码小写形式，用于创建模块的路径。</param>
        /// <param name="appIdentifier">应用标识符小写形式，用于创建模块的路径。</param>
        internal NavModule(Data.Module module, string developerCode, string appIdentifier)
        {
            // 模块入口功能的标识符
            var entrance = "index";

            // 应用配置
            var appConfig = Pittypat.Configuration.PittypatConfig.Current.Apps[developerCode, appIdentifier];

            if (appConfig != null)
            {
                // 模块配置
                var moduleConfig = appConfig.Modules[module.Identifier];
                if (moduleConfig != null)
                {
                    // 入口功能的配置
                    var funcConfig = moduleConfig.Functions.Count > 0 ? moduleConfig.Functions[0] : null;
                    if (funcConfig != null)
                    {
                        // 入口功能的标识符
                        entrance = funcConfig.Identifier.ToLower();
                    }
                }
            }

            // 模块的入口路径
            this.url = String.Format("~/com/{0}/{1}/{2}/{3}.html", 
                developerCode, appIdentifier, module.Identifier.ToLower(), entrance);
            this.module = module;
        }

        /// <summary>
        /// 获取模块的描述信息。
        /// </summary>
        @string? INavModule.Description
        {
            get
            {
                return this.module.Description;
            }
        }

        /// <summary>
        /// 获取模块的 Id。
        /// </summary>
        uuid? INavModule.Id
        {
            get
            {
                return this.module.Id;
            }
        }

        /// <summary>
        /// 获取模块的名称。
        /// </summary>
        @string? INavModule.Name
        {
            get
            {
                return this.module.Name;
            }
        }

        /// <summary>
        /// 获取模块的路径。
        /// </summary>
        @string? INavModule.Url
        {
            get
            {
                return this.url;
            }
        }

        /// <summary>
        /// 将当前对象作为 JSON 字符串写入指定的文本流。
        /// </summary>
        /// <param name="writer">目标文本流。</param>
        /// <exception cref="global::System.ArgumentNullException">writer 是 null。</exception>
        void IJson.Write(TextWriter writer)
        {
            if (writer == null)
            {
                throw new global::System.ArgumentNullException("writer");
            }

            writer.Write('{');

            writer.Write("\"id\":");
            this.module.Id.Write(writer);
            writer.Write(',');
            
            writer.Write("\"name\":");
            this.module.Name.Write(writer);
            writer.Write(',');

            writer.Write("\"description\":");
            this.module.Description.Write(writer);
            writer.Write(',');

            writer.Write("\"url\":");
            this.url.Write(writer);

            writer.Write('}');
        }
    }
}
